package com.soywer.rpc.rpc07;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.Socket;

import com.soywer.rpc.common.User;

/**
 * 功能描述：
 *
 * @author 18065916_李猛
 * @since 2021/3/8
 */
public class Stub {

    public static Object getStub(final Class clazz){
        InvocationHandler h = new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
                Socket s = new Socket("127.0.0.1",8888);
                //对象输出流
                ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
                //类名
                String className = clazz.getName();
                //方法名
                String methodName = method.getName();
                //方法参数类型
                Class[] parameterTypes = method.getParameterTypes();
                oos.writeUTF(className);//对象输出流-写入服务器-写类名
                oos.writeUTF(methodName);//对象输出流-写入服务器-写方法名
                oos.writeObject(parameterTypes);//对象输出流-写入服务器-写参数类型
                oos.writeObject(args);//对象输出流-写入服务器-写参数
                oos.flush();//对象输出流-写入服务器-刷新

                //对象输入流
                ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
                //对象输入流-读取服务器，调用指定方法后放回的对象；
                Object o = ois.readObject();

                oos.close();
                s.close();
                return o;
            }
        };
        Object o = Proxy.newProxyInstance(clazz.getClassLoader(),new Class[]{clazz},h);
        return o;
    }

}
